<!DOCTYPE html><html><head>
      <title>Raft&#x4E00;&#x81F4;&#x6027;&#x7B97;&#x6CD5;</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      
      
        <script type="text/x-mathjax-config">
          MathJax.Hub.Config({"extensions":["tex2jax.js"],"jax":["input/TeX","output/HTML-CSS"],"messageStyle":"none","tex2jax":{"processEnvironments":false,"processEscapes":true,"inlineMath":[["$","$"],["\\(","\\)"]],"displayMath":[["$$","$$"],["\\[","\\]"]]},"TeX":{"extensions":["AMSmath.js","AMSsymbols.js","noErrors.js","noUndefined.js"]},"HTML-CSS":{"availableFonts":["TeX"]}});
        </script>
        <script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js"></script>
        
      
      
      
      <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mermaid@8.5.2/dist/mermaid.min.js"></script>
      
      
      
      
      
      <style>
      /**
 * prism.js Github theme based on GitHub's theme.
 * @author Sam Clarke
 */
code[class*="language-"],
pre[class*="language-"] {
  color: #333;
  background: none;
  font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
  text-align: left;
  white-space: pre;
  word-spacing: normal;
  word-break: normal;
  word-wrap: normal;
  line-height: 1.4;

  -moz-tab-size: 8;
  -o-tab-size: 8;
  tab-size: 8;

  -webkit-hyphens: none;
  -moz-hyphens: none;
  -ms-hyphens: none;
  hyphens: none;
}

/* Code blocks */
pre[class*="language-"] {
  padding: .8em;
  overflow: auto;
  /* border: 1px solid #ddd; */
  border-radius: 3px;
  /* background: #fff; */
  background: #f5f5f5;
}

/* Inline code */
:not(pre) > code[class*="language-"] {
  padding: .1em;
  border-radius: .3em;
  white-space: normal;
  background: #f5f5f5;
}

.token.comment,
.token.blockquote {
  color: #969896;
}

.token.cdata {
  color: #183691;
}

.token.doctype,
.token.punctuation,
.token.variable,
.token.macro.property {
  color: #333;
}

.token.operator,
.token.important,
.token.keyword,
.token.rule,
.token.builtin {
  color: #a71d5d;
}

.token.string,
.token.url,
.token.regex,
.token.attr-value {
  color: #183691;
}

.token.property,
.token.number,
.token.boolean,
.token.entity,
.token.atrule,
.token.constant,
.token.symbol,
.token.command,
.token.code {
  color: #0086b3;
}

.token.tag,
.token.selector,
.token.prolog {
  color: #63a35c;
}

.token.function,
.token.namespace,
.token.pseudo-element,
.token.class,
.token.class-name,
.token.pseudo-class,
.token.id,
.token.url-reference .token.variable,
.token.attr-name {
  color: #795da3;
}

.token.entity {
  cursor: help;
}

.token.title,
.token.title .token.punctuation {
  font-weight: bold;
  color: #1d3e81;
}

.token.list {
  color: #ed6a43;
}

.token.inserted {
  background-color: #eaffea;
  color: #55a532;
}

.token.deleted {
  background-color: #ffecec;
  color: #bd2c00;
}

.token.bold {
  font-weight: bold;
}

.token.italic {
  font-style: italic;
}


/* JSON */
.language-json .token.property {
  color: #183691;
}

.language-markup .token.tag .token.punctuation {
  color: #333;
}

/* CSS */
code.language-css,
.language-css .token.function {
  color: #0086b3;
}

/* YAML */
.language-yaml .token.atrule {
  color: #63a35c;
}

code.language-yaml {
  color: #183691;
}

/* Ruby */
.language-ruby .token.function {
  color: #333;
}

/* Markdown */
.language-markdown .token.url {
  color: #795da3;
}

/* Makefile */
.language-makefile .token.symbol {
  color: #795da3;
}

.language-makefile .token.variable {
  color: #183691;
}

.language-makefile .token.builtin {
  color: #0086b3;
}

/* Bash */
.language-bash .token.keyword {
  color: #0086b3;
}

/* highlight */
pre[data-line] {
  position: relative;
  padding: 1em 0 1em 3em;
}
pre[data-line] .line-highlight-wrapper {
  position: absolute;
  top: 0;
  left: 0;
  background-color: transparent;
  display: block;
  width: 100%;
}

pre[data-line] .line-highlight {
  position: absolute;
  left: 0;
  right: 0;
  padding: inherit 0;
  margin-top: 1em;
  background: hsla(24, 20%, 50%,.08);
  background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
  pointer-events: none;
  line-height: inherit;
  white-space: pre;
}

pre[data-line] .line-highlight:before, 
pre[data-line] .line-highlight[data-end]:after {
  content: attr(data-start);
  position: absolute;
  top: .4em;
  left: .6em;
  min-width: 1em;
  padding: 0 .5em;
  background-color: hsla(24, 20%, 50%,.4);
  color: hsl(24, 20%, 95%);
  font: bold 65%/1.5 sans-serif;
  text-align: center;
  vertical-align: .3em;
  border-radius: 999px;
  text-shadow: none;
  box-shadow: 0 1px white;
}

pre[data-line] .line-highlight[data-end]:after {
  content: attr(data-end);
  top: auto;
  bottom: .4em;
}html body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ul,html body>ol{margin-bottom:16px}html body ul,html body ol{padding-left:2em}html body ul.no-list,html body ol.no-list{padding:0;list-style-type:none}html body ul ul,html body ul ol,html body ol ol,html body ol ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:bold;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em !important;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::before,html body code::after{letter-spacing:-0.2em;content:"\00a0"}html body pre>code{padding:0;margin:0;font-size:.85em !important;word-break:normal;white-space:pre;background:transparent;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;font-size:.85em !important;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:before,html body pre tt:before,html body pre code:after,html body pre tt:after{content:normal}html body p,html body blockquote,html body ul,html body ol,html body dl,html body pre{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body pre,html body code{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview .pagebreak,.markdown-preview .newpage{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center !important}.markdown-preview:not([for="preview"]) .code-chunk .btn-group{display:none}.markdown-preview:not([for="preview"]) .code-chunk .status{display:none}.markdown-preview:not([for="preview"]) .code-chunk .output-div{margin-bottom:16px}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0}@media screen and (min-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{font-size:14px !important;padding:1em}}@media print{html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,0.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{padding:0 1.6em;margin-top:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc li{margin-bottom:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{list-style-type:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% -  300px);padding:2em calc(50% - 457px -  150px);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
/* Please visit the URL below for more information: */
/*   https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */

      </style>
    </head>
    <body for="html-export">
      <div class="mume markdown-preview  ">
      <h1 class="mume-header" id="raft%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95">Raft&#x4E00;&#x81F4;&#x6027;&#x7B97;&#x6CD5;</h1>

<p><span id="toc"></span></p>
<ul>
<li><a href="#raft%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95">Raft&#x4E00;&#x81F4;&#x6027;&#x7B97;&#x6CD5;</a>
<ul>
<li><a href="#%E5%89%8D%E8%A6%81%E8%AF%B4%E6%98%8Etoc">&#x524D;&#x8981;&#x8BF4;&#x660E;</a>
<ul>
<li><a href="#%E9%9B%86%E7%BE%A4%E4%B8%AD%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%8A%B6%E6%80%81toc">&#x96C6;&#x7FA4;&#x4E2D;&#x670D;&#x52A1;&#x5668;&#x72B6;&#x6001;</a></li>
<li><a href="#requestvote-rpctoc">RequestVote RPC</a></li>
<li><a href="#appendentries-rpctoc">AppendEntries RPC</a></li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%84%E5%88%99toc">&#x670D;&#x52A1;&#x5668;&#x89C4;&#x5219;</a></li>
<li><a href="#raft%E4%BF%9D%E8%AF%81%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E6%9D%A1%E4%BB%B6toc">Raft&#x4FDD;&#x8BC1;&#x4E00;&#x81F4;&#x6027;&#x7684;&#x6761;&#x4EF6;</a></li>
</ul>
</li>
<li><a href="#%E9%80%89%E4%B8%BEleadertoc">&#x9009;&#x4E3E;Leader</a></li>
<li><a href="#%E6%97%A5%E5%BF%97%E5%A4%8D%E5%88%B6toc">&#x65E5;&#x5FD7;&#x590D;&#x5236;</a></li>
<li><a href="#%E9%9B%86%E7%BE%A4%E5%92%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BA%A4%E4%BA%92toc">&#x96C6;&#x7FA4;&#x548C;&#x5BA2;&#x6237;&#x7AEF;&#x4EA4;&#x4E92;</a></li>
<li><a href="#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99toc">&#x53C2;&#x8003;&#x8D44;&#x6599;</a></li>
</ul>
</li>
</ul>
<h2 class="mume-header" id="%E5%89%8D%E8%A6%81%E8%AF%B4%E6%98%8Etoc"><a href="#toc">&#x524D;&#x8981;&#x8BF4;&#x660E;</a></h2>

<p>&#x4E3A;&#x4E86;&#x4FBF;&#x4E8E;&#x7406;&#x89E3;&#x548C;&#x5B9E;&#x73B0;, Raft&#x7B97;&#x6CD5;&#x5C06;&#x96C6;&#x7FA4;&#x4E2D;&#x591A;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x4E00;&#x81F4;&#x6027;&#x95EE;&#x9898;&#x5206;&#x89E3;&#x4E3A;: Leader&#x9009;&#x4E3E;, &#x65E5;&#x5FD7;&#x590D;&#x5236;&#x548C;&#x5B89;&#x5168;&#x8FD9;&#x51E0;&#x4E2A;&#x5B50;&#x95EE;&#x9898;;</p>
<p>&#x8BB0;&#x6709;&#x96C6;&#x7FA4;<span class="mathjax-exps">$\{C_i,\ i=1,2\dots m\}$</span>, &#x89D2;&#x8272;&#x96C6;<span class="mathjax-exps">$R=\{Leader, Candidate, Follower\}$</span>, &#x5BA2;&#x6237;&#x7AEF;&#x5411;&#x96C6;&#x7FA4;&#x53D1;&#x9001;&#x7684;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#x4E3A;&#x96C6;<span class="mathjax-exps">$\{L_j,\ j=1,2\dots n\}$</span>. <span class="mathjax-exps">$\{C_i\}$</span>&#x4E2D;&#x6BCF;&#x53F0;&#x670D;&#x52A1;&#x5668;(&#x6BCF;&#x4E2A;&#x5143;&#x7D20;)<span class="mathjax-exps">$C_i$</span>&#x90FD;&#x6709;&#x89D2;&#x8272;&#x5C5E;&#x6027;<span class="mathjax-exps">$r$</span>, &#x6EE1;&#x8DB3;<span class="mathjax-exps">$r\in R$</span>. &#x79F0;&#x96C6;&#x7FA4;&#x4E2D;&#x81F3;&#x5C11;&#x6709;<span class="mathjax-exps">$m/2 +1$</span>&#x4E2A;&#x5143;&#x7D20;&#x90FD;&#x80FD;&#x5B8C;&#x6210;&#x76F8;&#x540C;&#x7684;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;<span class="mathjax-exps">$L_j$</span>&#x7684;&#x5DE5;&#x4F5C;&#x72B6;&#x6001;(&#x4E00;&#x81F4;&#x6027;&#x5DE5;&#x4F5C;&#x72B6;&#x6001;&#x4E0B;)&#x4E3A;<em>&#x7A33;&#x6001;</em>, &#x975E;&#x4E00;&#x81F4;&#x6027;&#x5DE5;&#x4F5C;&#x72B6;&#x6001;&#x4E0B;&#x4E3A;<em>&#x975E;&#x7A33;&#x6001;</em>. &#x5B9E;&#x73B0;Raft&#x7B97;&#x6CD5;&#x7684;&#x96C6;&#x7FA4;&#x7684;&#x5DE5;&#x4F5C;&#x72B6;&#x6001;&#x603B;&#x662F;&#x80FD;&#x5728;&#x6709;&#x9650;&#x7684;&#x65F6;&#x95F4;&#x5185;&#x4ECE;&#x975E;&#x7A33;&#x6001;&#x6536;&#x655B;&#x5230;&#x7A33;&#x6001;;</p>
<h3 class="mume-header" id="%E9%9B%86%E7%BE%A4%E4%B8%AD%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%8A%B6%E6%80%81toc"><a href="#toc">&#x96C6;&#x7FA4;&#x4E2D;&#x670D;&#x52A1;&#x5668;&#x72B6;&#x6001;</a></h3>

<p><span class="mathjax-exps">$\forall C\in \{C_i\}$</span>&#x7684;&#x6301;&#x4E45;&#x5316;&#x72B6;&#x6001;:</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x72B6;&#x6001;</th>
<th style="text-align:center">&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>currentTerm</code></td>
<td style="text-align:center"><span class="mathjax-exps">$C$</span>&#x63A5;&#x6536;&#x5230;&#x7684;&#x6700;&#x65B0;Leader/Candidate&#x4EFB;&#x671F;&#x53F7;(&#x521D;&#x59CB;&#x503C;&#x662F;0, &#x5355;&#x8C03;&#x9012;&#x589E;)</td>
</tr>
<tr>
<td style="text-align:center"><code>log[]</code></td>
<td style="text-align:center">&#x6709;&#x5E8F;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x96C6;(<strong>&#x6BCF;&#x6761;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5305;&#x542B;&#x4ECE;&#x5BA2;&#x6237;&#x7AEF;&#x63A5;&#x6536;&#x7684;&#x65E5;&#x5FD7;, &#x53CA;&#x63A5;&#x6536;&#x8BE5;&#x65E5;&#x5FD7;&#x7684;Leader&#x7684;&#x4EFB;&#x671F;</strong>), &#x7D22;&#x5F15;&#x4ECE;1&#x5F00;&#x59CB;</td>
</tr>
<tr>
<td style="text-align:center"><code>votedFor</code></td>
<td style="text-align:center">&#x5F53;&#x524D;&#x4EFB;&#x671F;, <span class="mathjax-exps">$C$</span>&#x63A5;&#x6536;&#x5230;&#x7684;&#x6295;&#x7968;&#x8BF7;&#x6C42;&#x7684;Candidate&#x7684;ID&#x6807;&#x8BC6;</td>
</tr>
</tbody>
</table>
<p><span class="mathjax-exps">$\forall C\in \{C_i\}$</span>&#x7684;&#x6613;&#x53D8;&#x72B6;&#x6001;:</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x72B6;&#x6001;</th>
<th style="text-align:center">&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>commidIndex</code></td>
<td style="text-align:center"><span class="mathjax-exps">$C$</span>&#x63A5;&#x6536;&#x5230;&#x7684;&#x96C6;&#x7FA4;&#x4E2D;&#x5DF2;&#x63D0;&#x4EA4;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7D22;&#x5F15;&#x7684;&#x6700;&#x5927;&#x503C;(&#x521D;&#x59CB;&#x503C;0, &#x5355;&#x8C03;&#x9012;&#x589E;)</td>
</tr>
<tr>
<td style="text-align:center"><code>lastApplied</code></td>
<td style="text-align:center"><span class="mathjax-exps">$C$</span>&#x63A5;&#x6536;&#x5230;&#x7684;&#x96C6;&#x7FA4;&#x4E2D;&#x5DF2;&#x6267;&#x884C;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7D22;&#x5F15;&#x7684;&#x6700;&#x5927;&#x503C;(&#x521D;&#x59CB;&#x503C;0, &#x5355;&#x8C03;&#x9012;&#x589E;)</td>
</tr>
</tbody>
</table>
<p><span class="mathjax-exps">$\forall C\in \{C_i\}, r=Leader$</span>&#x7684;&#x6613;&#x53D8;&#x72B6;&#x6001;:</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x72B6;&#x6001;</th>
<th style="text-align:center">&#x8BF4;&#x660E;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>nextIndex[]</code></td>
<td style="text-align:center">&#x5F53;&#x524D;Leader&#x5411;<span class="mathjax-exps">$C_i$</span>&#x53D1;&#x9001;&#x7684;&#x4E0B;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;(&#x521D;&#x59CB;&#x4E3A;<code>log[]</code>&#x6700;&#x5927;&#x7D22;&#x5F15;+1)</td>
</tr>
<tr>
<td style="text-align:center"><code>matchIndex[]</code></td>
<td style="text-align:center">&#x5F53;&#x524D;Leader&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x5411;<span class="mathjax-exps">$C_i$</span>&#x590D;&#x5236;&#x7684;&#x6700;&#x540E;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;(&#x521D;&#x59CB;&#x4E3A;0, &#x5355;&#x8C03;&#x9012;&#x589E;)</td>
</tr>
</tbody>
</table>
<h3 class="mume-header" id="requestvote-rpctoc"><a href="#toc">RequestVote RPC</a></h3>

<p>RequesetVote RPC&#x53EA;&#x7531;<span class="mathjax-exps">$C_i, r=Candidate$</span>&#x7684;&#x670D;&#x52A1;&#x5668;&#x7528;&#x4E8E;&#x8BF7;&#x6C42;&#x6295;&#x7968;&#x8C03;&#x7528;;</p>
<ul>
<li>
<p>&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x7684;&#x53C2;&#x6570;:</p>
<ul>
<li>term: &#x8BE5;Candidate&#x7684;<code>currentTerm</code>;</li>
<li>candidateId: &#x8BE5;Candidate&#x7684;ID&#x6807;&#x8BC6;;</li>
<li>lastLogIndex: &#x8BE5;Candidate&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;<code>log[]</code>&#x4E2D;&#x6700;&#x540E;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x7684;&#x7D22;&#x5F15;;</li>
<li>lastLogTerm: lastLogIndex&#x6240;&#x5BF9;&#x5E94;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x4EFB;&#x671F;;</li>
</ul>
</li>
<li>
<p>&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x8FD4;&#x56DE;&#x503C;:</p>
<ul>
<li>term: RPC&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>currentTerm</code>;</li>
<li>voteGraned: true&#x8868;&#x793A;&#x8C03;&#x7528;&#x8005;&#x83B7;&#x5F97;&#x6295;&#x7968;, false&#x8868;&#x793A;&#x8C03;&#x7528;&#x8005;&#x672A;&#x83B7;&#x5F97;&#x6295;&#x7968;</li>
</ul>
</li>
<li>
<p>RPC&#x88AB;&#x8C03;&#x7528;&#x8005;&#x9700;&#x8981;&#x5B8C;&#x6210;&#x7684;&#x5B9E;&#x73B0;;</p>
<ul>
<li>&#x5982;&#x679C;&#x53C2;&#x6570;term&#x5C0F;&#x4E8E;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>currentTerm</code>, &#x8FD4;&#x56DE;false;</li>
<li>&#x5982;&#x679C;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>log[]</code>&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x4EFB;&#x671F;&#x5927;&#x4E8E;&#x7B49;&#x4E8E;lastLogTerm, &#x6216;&#x4EFB;&#x671F;&#x76F8;&#x7B49;&#x4E14;<code>log[]</code>&#x6700;&#x5927;&#x7D22;&#x5F15;&#x5927;&#x4E8E;&#x7B49;&#x4E8E;lastLogIndex, &#x5219;&#x6295;&#x7968;&#x7ED9;&#x8C03;&#x7528;&#x8005;. &#x5426;&#x5219;, &#x4E0D;&#x6295;&#x7968;&#x7ED9;&#x4ED6;;</li>
</ul>
</li>
</ul>
<h3 class="mume-header" id="appendentries-rpctoc"><a href="#toc">AppendEntries RPC</a></h3>

<p>AppendEntries RPC&#x53EA;&#x7531;<span class="mathjax-exps">$C_i, r=Leader$</span>&#x7684;&#x670D;&#x52A1;&#x5668;&#x7528;&#x4E8E;&#x53D1;&#x9001;&#x65E5;&#x5FD7;&#x6761;&#x76EE;, &#x6216;&#x53D1;&#x9001;&#x5FC3;&#x8DF3;&#x5305;&#x4F7F;&#x7528;;</p>
<ul>
<li>&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x9700;&#x63D0;&#x4F9B;&#x7684;&#x53C2;&#x6570;:
<ul>
<li>term: &#x8BE5;Leader&#x7684;<code>currentTerm</code>;</li>
<li>leaderId: &#x8BE5;Leader&#x7684;ID&#x6807;&#x8BC6;;</li>
<li>entries[]: &#x53D1;&#x9001;&#x7ED9;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;(&#x53EF;&#x4EE5;&#x662F;&#x7A7A;: &#x7A7A;&#x65F6;&#x8BE5;&#x8FDC;&#x7A0B;&#x8C03;&#x6570;&#x636E;&#x5305;&#x8BB0;&#x4F5C;&#x5FC3;&#x8DF3;&#x5305;. &#x975E;&#x7A7A;&#x65F6;entries[] &#x5E94;&#x8BE5;&#x662F;<code>log[]</code>&#x7684;&#x5B50;&#x6BB5;, &#x6570;&#x636E;&#x5305;&#x8BB0;&#x4F5C;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5305;);</li>
<li>prevLogIndex: entries[] &#x7684;&#x524D;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;(entries[]&#x4E2D;&#x6700;&#x5C0F;&#x7D22;&#x5F15;&#x9012;&#x51CF;1);</li>
<li>prevLogTerm: prevLogIndex&#x5BF9;&#x5E94;&#x7684;&#x4EFB;&#x671F;;</li>
<li>leaderCommit: &#x8BE5;Leader&#x7684;<code>commitIndex</code>;</li>
</ul>
</li>
<li>&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x8FD4;&#x56DE;&#x503C;:
<ul>
<li>term: &#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>currentTerm</code>;</li>
<li>sucess: &#x88AB;&#x8C03;&#x7528;&#x8005;&#x4E2D;&#x5305;&#x542B;prevLogIndex&#x548C;prevLogTerm&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5219;&#x8FD4;&#x56DE;true, &#x5426;&#x5219;false;</li>
</ul>
</li>
<li>RPC&#x88AB;&#x8C03;&#x7528;&#x8005;&#x9700;&#x8981;&#x5B8C;&#x6210;&#x7684;&#x5B9E;&#x73B0;:
<ul>
<li>&#x53C2;&#x6570;term&#x5C0F;&#x4E8E;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>currentTerm</code>, &#x8FD4;&#x56DE;false;</li>
<li>&#x88AB;&#x8C03;&#x7528;&#x8005;&#x4E2D;&#x4E0D;&#x5305;&#x542B;prevLogIndex&#x548C;prevLogTerm&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5219;&#x8FD4;&#x56DE;false;</li>
<li>&#x5982;&#x679C;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x548C;entries[]&#x4E2D;&#x76F8;&#x540C;&#x7D22;&#x5F15;, &#x4F46;&#x4E0D;&#x540C;&#x4EFB;&#x671F;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;, &#x90A3;&#x4E48;&#x5220;&#x9664;&#x88AB;&#x8C03;&#x7528;&#x8005;<code>log[]</code>&#x4E2D;&#x8BE5;&#x6761;&#x7D22;&#x5F15;&#x540E;&#x7684;&#x6240;&#x6709;&#x65E5;&#x5FD7;&#x6761;&#x76EE;;</li>
<li>&#x5C06;entries[] &#x4E2D;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x9644;&#x52A0;&#x5230;<code>log[]</code>&#x4E2D;;</li>
<li>&#x5982;&#x679C;&#x53C2;&#x6570;leaderCommit&#x5927;&#x4E8E;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>commitIndex</code>, &#x90A3;&#x4E48;&#x8BBE;&#x7F6E;&#x88AB;&#x8C03;&#x7528;&#x8005;&#x7684;<code>commitIndex=min(leaderCommit, entries[]&#x4E2D;&#x7D22;&#x5F15;&#x6700;&#x5927;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7D22;&#x5F15;)</code>;</li>
</ul>
</li>
</ul>
<h3 class="mume-header" id="%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%84%E5%88%99toc"><a href="#toc">&#x670D;&#x52A1;&#x5668;&#x89C4;&#x5219;</a></h3>

<p><span id="rules_for_servers"></span></p>
<ul>
<li><span class="mathjax-exps">$\forall C\in \{C_i\}$</span>:
<ul>
<li><code>where commitIndex &gt; lastApplied { exec(log[lastApplied]); lastApplied += 1; }</code>;</li>
<li>&#x5982;&#x679C;&#x63A5;&#x6536;&#x5230;&#x7684;&#x6570;&#x636E;&#x5305;&#x4E2D;term&#x5927;&#x4E8E;<code>currentTerm</code>, &#x90A3;&#x4E48;&#x8BE5;&#x670D;&#x52A1;&#x5668;<code>currentTerm=term</code>&#x5E76;&#x8F6C;&#x4E3A;Follower;</li>
<li>&#x5728;&#x4E00;&#x4E2A;&#x4EFB;&#x671F;&#x5185;, &#x6700;&#x591A;&#x53EA;&#x80FD;&#x7ED9;&#x4E00;&#x4E2A;Candidate&#x6295;&#x7968;;</li>
</ul>
</li>
<li><span class="mathjax-exps">$\forall C\in \{C_i, r=Follower\}$</span>:
<ul>
<li>&#x9700;&#x8981;&#x54CD;&#x5E94;Candidate&#x548C;Leader&#x7684;RPC&#x8C03;&#x7528;;</li>
<li>&#x8D85;&#x65F6;&#x672A;&#x6536;&#x5230;Leader&#x6570;&#x636E;&#x5305;, &#x8F6C;&#x4E3A;Candidate;</li>
</ul>
</li>
<li><span class="mathjax-exps">$\forall C\in \{C_i, r=Candidate\}$</span>:
<ul>
<li>&#x6210;&#x4E3A;Candidate&#x540E;&#x53D1;&#x8D77;&#x4E00;&#x6B21;&#x9009;&#x4E3E;:
<ul>
<li>&#x589E;&#x52A0;<code>currentTerm</code>;</li>
<li>&#x7ED9;&#x81EA;&#x5DF1;&#x6295;&#x4E00;&#x7968;;</li>
<li>&#x91CD;&#x7F6E;&#x8D85;&#x65F6;&#x8BA1;&#x65F6;&#x5668;(&#x5728;&#x6307;&#x5B9A;&#x65F6;&#x95F4;&#x533A;&#x95F4;&#x5185;(&#x8BBA;&#x6587;&#x4E2D;&#x7ED9;&#x7684;&#x793A;&#x4F8B;&#x662F;150ms~300ms, <strong>&#x5B9E;&#x9645;&#x4E2D;&#x9700;&#x6839;&#x636E;&#x5B9E;&#x9645;&#x7F51;&#x7EDC;&#x60C5;&#x51B5;/&#x96C6;&#x7FA4;&#x89C4;&#x6A21;/&#x6536;&#x655B;&#x901F;&#x5EA6;&#x9009;&#x62E9;&#x5408;&#x9002;&#x7684;&#x533A;&#x95F4;&#x503C;</strong>, &#x8BBA;&#x6587;&#x7ED9;&#x51FA;&#x7684;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#x9700;&#x6EE1;&#x8DB3;&#x7684;&#x6761;&#x4EF6;&#x662F;<span class="mathjax-exps">$broadcastTime\le electionTimeout\le MTBF$</span>)&#x968F;&#x673A;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x65F6;&#x95F4;&#x4F5C;&#x4E3A;&#x8D85;&#x65F6;&#x9608;&#x503C;);</li>
<li>&#x5411;&#x5176;&#x5B83;&#x6240;&#x6709;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;<code>RequestVote RPC</code>;</li>
</ul>
</li>
<li>&#x82E5;&#x83B7;&#x5F97;&#x81F3;&#x5C11;<span class="mathjax-exps">$m/2+1$</span>&#x5F20;&#x6295;&#x7968;&#x540E;, &#x5219;&#x6210;&#x4E3A;Leader;</li>
<li>&#x82E5;&#x6536;&#x5230;&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;<code>AppendEntries RPC</code>&#x6570;&#x636E;&#x5305;&#x4E2D;term&#x5927;&#x4E8E;<code>currentTerm</code>, &#x90A3;&#x4E48;&#x6210;&#x4E3A;Follower;</li>
<li>&#x82E5;&#x9009;&#x4E3E;&#x8D85;&#x65F6;, &#x91CD;&#x65B0;&#x53D1;&#x8D77;&#x4E00;&#x6B21;&#x9009;&#x4E3E;;</li>
</ul>
</li>
<li><span class="mathjax-exps">$\forall C\in \{C_i, r=Leader\}$</span>:
<ul>
<li>&#x53D1;&#x9001;<code>AppendEntries RPC</code>&#x6570;&#x636E;&#x5305;, &#x544A;&#x77E5;&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;&#x96C6;&#x7FA4;&#x4E2D;&#x6709;Leader&#x4E86;, &#x53EF;&#x4EE5;&#x4E0D;&#x7528;&#x53D1;&#x8D77;&#x9009;&#x4E3E;&#x6295;&#x7968;&#x4E86;;</li>
<li>&#x4ECE;&#x5BA2;&#x6237;&#x7AEF;&#x63A5;&#x6536;&#x5230;&#x65E5;&#x5FD7;&#x540E;, &#x5219;&#x5408;&#x6210;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x6DFB;&#x52A0;&#x5230;<code>log[]</code>&#x4E2D;, &#x5E76;&#x8D1F;&#x8D23;&#x5728;&#x8BE5;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5728;&#x96C6;&#x7FA4;&#x4E2D;&#x6267;&#x884C;&#x540E;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;;</li>
<li>&#x67E5;&#x8BE2;<code>nextIndex[]</code>&#x662F;&#x5426;&#x6709;&#x54EA;&#x4E2A;Follower&#x7684;nextIndex&#x5C0F;&#x4E8E;&#x5F53;&#x524D;&#x7684;<code>log[]</code>&#x6700;&#x5927;&#x7D22;&#x5F15;, &#x6709;&#x5219;&#x5411;&#x8BE5;Follower&#x53D1;&#x9001;<code>AppendEntries RPC</code>&#x544A;&#x77E5;&#x8BE5;Follower&#x6709;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x4E86;:
<ul>
<li>RPC&#x8FD4;&#x56DE;true: &#x66F4;&#x65B0;<code>nextIndex[]</code>&#x548C;<code>matchIndex[]</code>;</li>
<li>RPC&#x8FD4;&#x56DE;false: <code>nextIndex[]</code>&#x9012;&#x51CF;1;</li>
</ul>
</li>
<li>&#x82E5;&#x81F3;&#x5C11;&#x6709;<span class="mathjax-exps">$m/2+1$</span>&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x90FD;&#x590D;&#x5236;&#x4E86;&#x4E86;&#x67D0;&#x4E00;&#x65E5;&#x5FD7;&#x6761;&#x76EE;(&#x610F;&#x542B;&#x65E5;&#x5FD7;&#x5185;&#x5BB9;&#x548C;&#x4EFB;&#x671F;&#x76F8;&#x540C;), &#x4E14;&#x8BE5;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;&#x5927;&#x4E8E;<code>commitIndex</code>, &#x90A3;&#x4E48;<code>commitIndex</code>&#x66F4;&#x65B0;&#x4E3A;&#x8BE5;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;;</li>
</ul>
</li>
</ul>
<h3 class="mume-header" id="raft%E4%BF%9D%E8%AF%81%E4%B8%80%E8%87%B4%E6%80%A7%E7%9A%84%E6%9D%A1%E4%BB%B6toc"><a href="#toc">Raft&#x4FDD;&#x8BC1;&#x4E00;&#x81F4;&#x6027;&#x7684;&#x6761;&#x4EF6;</a></h3>

<p><span id="safety_for_raft"></span></p>
<ul>
<li>Election Safety: &#x7A33;&#x6001;&#x4E0B;&#x6709;&#x4E14;&#x4EC5;&#x6709;&#x96C6;&#x7FA4;&#x4E2D;&#x4EC5;&#x6709;&#x4E00;&#x4E2A;Leader;</li>
<li>Leader Append-Only: <strong>Leader</strong>&#x4EC5;&#x4F1A;&#x5C06;&#x65E5;&#x5FD7;&#x6DFB;&#x52A0;&#x5230;<code>log[]</code>&#x4E2D;, &#x4E0D;&#x4F1A;&#x5220;&#x9664;&#x548C;&#x8986;&#x76D6;&#x65E5;&#x5FD7;&#x6761;&#x76EE;;</li>
<li>Leader Matching: <code>log[]</code>&#x67D0;&#x4E2A;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x7684;&#x7D22;&#x5F15;&#x548C;&#x4EFB;&#x671F;&#x53F7;&#x76F8;&#x540C;, &#x90A3;&#x4E48;&#x8BE5;&#x7D22;&#x5F15;&#x4E4B;&#x524D;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x90FD;&#x662F;&#x4E00;&#x81F4;&#x7684;;</li>
<li>Leader Completeness: &#x5982;&#x679C;&#x67D0;&#x6761;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5728;&#x67D0;&#x4E2A;&#x4EFB;&#x671F;&#x63D0;&#x4EA4;&#x4E86;, &#x90A3;&#x4E48;&#x8BE5;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x5728;&#x540E;&#x7EED;&#x65B0;&#x4EFB;&#x671F;&#x7684;Leader&#x4E2D;&#x4F1A;&#x4E00;&#x76F4;&#x5B58;&#x5728;;</li>
<li>State Machine Safety: &#x5982;&#x679C;&#x67D0;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x5DF2;&#x7ECF;&#x6267;&#x884C;&#x4E86;&#x67D0;&#x4E2A;&#x7D22;&#x5F15;&#x5904;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;, &#x90A3;&#x4E48;&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;&#x4E0D;&#x4F1A;&#x5728;&#x8BE5;&#x7D22;&#x5F15;&#x5904;&#x6267;&#x884C;&#x4E0D;&#x540C;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;;</li>
</ul>
<h2 class="mume-header" id="%E9%80%89%E4%B8%BEleadertoc"><a href="#toc">&#x9009;&#x4E3E;Leader</a></h2>

<p><span class="mathjax-exps">$C\in\{C_i\}$</span>&#x7684;&#x89D2;&#x8272;&#x8F6C;&#x6362;&#x72B6;&#x6001;&#x673A;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;:</p>
<div class="mermaid">stateDiagram-v2
    [*] --&gt; Follower: &#x521D;&#x59CB;&#x5316;

    Follower --&gt; Candidate: &#x8D85;&#x65F6;&#x9009;&#x4E3E;

    Candidate --&gt; Candidate: &#x8D85;&#x65F6;&#x9009;&#x4E3E;
    Candidate --&gt; Follower: &#x53D1;&#x73B0;&#x4EFB;&#x671F;&#x66F4;&#x65B0;&#x7684;Leader
    Candidate --&gt; Leader: &#x8D85;&#x8FC7;&#x534A;&#x6570;&#x7684;&#x7968;&#x6570;

    Leader --&gt; Follower: &#x53D1;&#x73B0;&#x4EFB;&#x671F;&#x66F4;&#x65B0;&#x7684;Leader

</div><ul>
<li>&#x4ECE;&#x975E;&#x7A33;&#x6001;&#x6536;&#x655B;&#x5230;&#x7A33;&#x6001;&#x7684;&#x8FC7;&#x7A0B;:
<ul>
<li><span class="mathjax-exps">$\{C_i\}$</span>&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x5B50;&#x96C6;&#x4E2D;&#x81F3;&#x5C11;&#x6709;<span class="mathjax-exps">$m/2+1$</span>&#x53F0;&#x670D;&#x52A1;&#x5668;&#x76F8;&#x4E92;&#x4E4B;&#x95F4;&#x901A;&#x4FE1;&#x6B63;&#x5E38;, &#x8BB0;&#x5B50;&#x96C6;&#x5143;&#x7D20;&#x4E2A;&#x6570;&#x6700;&#x5927;&#x7684;&#x90A3;&#x4E2A;&#x5B50;&#x96C6;&#x4E3A;<span class="mathjax-exps">$\{C&apos;_i\}$</span>, <span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x7684;&#x8865;&#x96C6;&#x4E3A;<span class="mathjax-exps">$\{\bar{C_i}\}$</span>. &#x5176;&#x4E2D;<span class="mathjax-exps">$|\{C&apos;_i\}|=m&apos;$</span>:
<ul>
<li><span class="mathjax-exps">$m&apos;$</span>&#x4E2A;Follower;
<ul>
<li>Follower&#x6210;&#x4E3A;Candidate&#x540E;, &#x53D1;&#x8D77;&#x9009;&#x4E3E;&#x6295;&#x7968;, &#x76F4;&#x81F3;<span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x9009;&#x4E3E;&#x51FA;&#x6765;&#x4E86;&#x4E00;&#x4E2A;Leader(&#x9009;&#x4E3E;&#x64CD;&#x4F5C;&#x89C1;<a href="#rules_for_servers"><em>&#x670D;&#x52A1;&#x5668;&#x89C4;&#x5219;</em></a>);
<ul>
<li><span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4F1A;&#x4E0D;&#x4F1A;&#x9009;&#x4E0D;&#x51FA;Leader? &#x4E0D;&#x4F1A;, &#x56E0;&#x4E3A;&#x968F;&#x673A;&#x9009;&#x62E9;&#x8D85;&#x65F6;&#x65F6;&#x95F4;(&#x6307;&#x5B9A;&#x533A;&#x95F4;&#x5185;), &#x6545;&#x7ECF;&#x8FC7;&#x6709;&#x9650;&#x6B21;&#x9009;&#x4E3E;&#x5FC5;&#x7136;&#x4F1A;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x67D0;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#x6700;&#x77ED;&#x4E14;<code>currentTerm</code>&#x81F3;&#x5C11;(&#x5927;&#x4E8E;&#x7B49;&#x4E8E;)&#x6BD4;&#x5176;&#x5B83;&#x6240;&#x6709;&#x670D;&#x52A1;&#x5668;&#x65B0;, &#x4ECE;&#x800C;&#x53D1;&#x8D77;&#x4E00;&#x6B21;&#x4EFB;&#x671F;&#x66F4;&#x65B0;&#x7684;&#x9009;&#x4E3E;, &#x4EE5;&#x81F4;&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;&#x9009;&#x4E3E;&#x4ED6;&#x4E3A;Leader;</li>
<li><span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4F1A;&#x4E0D;&#x4F1A;&#x540C;&#x4E00;&#x4EFB;&#x671F;&#x9009;&#x51FA;&#x591A;&#x4E2A;Leader? &#x4E0D;&#x4F1A;, &#x56E0;&#x4E3A;&#x6240;&#x6709;&#x670D;&#x52A1;&#x5668;&#x5728;&#x4E00;&#x4E2A;&#x4EFB;&#x671F;&#x5185;&#x53EA;&#x80FD;&#x6295;&#x4E00;&#x6B21;&#x7968;(Candidate&#x53D1;&#x8D77;&#x6295;&#x7968;&#x4F1A;&#x9012;&#x589E;<code>currentTerm</code>&#x5148;&#x7ED9;&#x81EA;&#x5DF1;&#x6295;&#x4E00;&#x7968;, &#x53EA;&#x6709;&#x66F4;&#x65B0;&#x4EFB;&#x671F;&#x7684;<code>RequestVote RPC</code>&#x6570;&#x636E;&#x5305;&#x5230;&#x6765;&#x540E;&#x66F4;&#x65B0;&#x4E86;&#x81EA;&#x5DF1;&#x7684;&#x4EFB;&#x671F;&#x540E;, &#x624D;&#x4F1A;&#x6295;&#x7ED9;&#x8BE5;&#x6570;&#x636E;&#x5305;&#x7684;&#x670D;&#x52A1;&#x5668;), &#x5728;<span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4E0A;&#x7684;&#x67D0;&#x4E2A;&#x4EFB;&#x671F;&#x5185;&#x5FC5;&#x7136;&#x53EA;&#x4F1A;&#x6295;&#x51FA;&#x4E00;&#x4E2A;Leader;</li>
</ul>
</li>
</ul>
</li>
<li><span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4E0A;1&#x4E2A;Leader(&#x8BB0;&#x4E3A;<span class="mathjax-exps">$C_L$</span>), <span class="mathjax-exps">$x&lt;m&apos;$</span>&#x4E2A;Candidate, <span class="mathjax-exps">$\{\bar{C_i}\}$</span>&#x4E0A;&#x6CA1;&#x6709;Leader:
<ul>
<li>&#x5047;&#x5982;<span class="mathjax-exps">$x$</span>&#x4E2A;Candidate&#x7684;&#x4EFB;&#x671F;&#x90FD;&#x6BD4;<span class="mathjax-exps">$C_L$</span>&#x7684;&#x4EFB;&#x671F;&#x65E7;, &#x90A3;&#x4E48;&#x5FC5;&#x7136;&#x4F1A;&#x5F97;&#x4E0D;&#x5230;&#x6295;&#x7968;(&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;&#x5DF2;&#x7ECF;&#x6295;&#x7ED9;<span class="mathjax-exps">$C_L$</span>&#x4E86;), Candidate&#x8D85;&#x65F6;&#x540E;&#x66F4;&#x65B0;&#x4EFB;&#x671F;&#x91CD;&#x65B0;&#x53D1;&#x8D77;&#x9009;&#x4E3E;;
<ul>
<li>&#x6240;&#x6709;Candidate&#x7684;&#x7684;&#x4EFB;&#x671F;&#x5728;&#x66F4;&#x65B0;&#x8D85;&#x8FC7;<span class="mathjax-exps">$C_L$</span>&#x4E4B;&#x524D;, &#x53C8;&#x6536;&#x5230;<span class="mathjax-exps">$C_L$</span>&#x7684;<code>AppendEntries RPC</code>&#x6570;&#x636E;&#x5305;, &#x90A3;&#x4E48;Candidate&#x4F1A;&#x91CD;&#x65B0;&#x6210;&#x4E3A;Follower. &#x5426;&#x5219;, &#x76F4;&#x5230;&#x9009;&#x51FA;&#x4E00;&#x4E2A;&#x4EFB;&#x671F;&#x6BD4;<span class="mathjax-exps">$C_L$</span>&#x65B0;&#x7684;Leader, <span class="mathjax-exps">$C_L$</span>&#x8F6C;&#x4E3A;Follower;</li>
</ul>
</li>
</ul>
</li>
<li><span class="mathjax-exps">$\{C_i\}$</span>&#x4E2D;&#x8D85;&#x8FC7;1&#x4E2A;Leader: &#x56E0;&#x4E3A;<span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x6700;&#x591A;&#x53EA;&#x6709;1&#x4E2A;Leader, &#x6240;&#x4EE5;&#x5176;&#x5B83;Leader&#x5728;<span class="mathjax-exps">$\{\bar{C_i}\}$</span>&#x4E2D;. &#x5047;&#x5982;<span class="mathjax-exps">$\{\bar{C_i}\}$</span>&#x4E2D;&#x7684;&#x67D0;&#x4E9B;Leader&#x53C8;&#x53EF;&#x4EE5;&#x548C;<span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4E2D;&#x7684;&#x6240;&#x6709;&#x670D;&#x52A1;&#x5668;&#x6B63;&#x5E38;&#x901A;&#x4FE1;, &#x90A3;&#x4E48;&#x53D6;&#x8FD9;&#x4E9B;Leader&#x5E76;&#x5165;<span class="mathjax-exps">$\{C&apos;_i\}$</span>&#x4E2D;&#x7EC4;&#x6210;&#x65B0;&#x96C6;<span class="mathjax-exps">$\{C^{&apos;&apos;}_{i}\}$</span>:
<ul>
<li>&#x56E0;&#x4E3A;&#x4E00;&#x4E2A;&#x5DF2;&#x7ECF;&#x6536;&#x655B;&#x7684;&#x96C6;&#x4E0A;&#x53EA;&#x6709;&#x4E00;&#x4E2A;Leader, &#x6545;&#x591A;&#x4E2A;Leader&#x5FC5;&#x7136;&#x662F;&#x4E0D;&#x540C;&#x4EFB;&#x671F;&#x4E2D;&#x9009;&#x51FA;&#x7684;, &#x6545;&#x65E7;&#x4EFB;&#x671F;&#x7684;Leader&#x4F1A;&#x6536;&#x5230;&#x6700;&#x65B0;&#x4EFB;&#x671F;&#x7684;Leader&#x7684;<code>AppendEntries RPC</code>&#x6570;&#x636E;&#x5305;, &#x4ECE;&#x800C;&#x66F4;&#x65B0;&#x4EFB;&#x671F;&#x8F6C;&#x4E3A;Follower, &#x6700;&#x7EC8;<span class="mathjax-exps">$\{C^{&apos;&apos;}_{i}\}$</span>&#x4E0A;&#x4E5F;&#x53EA;&#x6709;&#x4E00;&#x4E2A;Leader&#x4E86;;</li>
</ul>
</li>
<li>&#x5176;&#x5B83;&#x975E;&#x7A33;&#x6001;&#x60C5;&#x51B5;&#x90FD;&#x53EF;&#x7531;&#x4EE5;&#x4E0A;&#x51E0;&#x79CD;&#x5B50;&#x60C5;&#x51B5;&#x5F52;&#x7EB3;&#x5F97;&#x51FA;&#x6700;&#x7EC8;&#x4F1A;&#x6536;&#x655B;, &#x4E0D;&#x518D;&#x8D58;&#x8FF0;;</li>
</ul>
</li>
<li><span class="mathjax-exps">$\{C_i\}$</span>&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x5B50;&#x96C6;&#x4E2D;&#x81F3;&#x591A;&#x6709;<span class="mathjax-exps">$m/2$</span>&#x53F0;&#x670D;&#x52A1;&#x5668;&#x76F8;&#x4E92;&#x4E4B;&#x95F4;&#x901A;&#x4FE1;&#x6B63;&#x5E38;:
<ul>
<li>&#x6B64;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#x6C38;&#x8FDC;&#x4E5F;&#x6536;&#x655B;&#x4E0D;&#x4E86;;</li>
</ul>
</li>
</ul>
</li>
<li>&#x7A33;&#x6001;&#x60C5;&#x51B5;&#x4E0B;&#x6709;&#x5982;&#x4E0B;&#x6027;&#x8D28;:
<ul>
<li>&#x81F3;&#x5C11;&#x6709;<span class="mathjax-exps">$m/2+1$</span>&#x53F0;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x95F4;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x901A;&#x4FE1;/&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;, &#x4E14;&#x8FD9;&#x4E9B;&#x6B63;&#x5E38;&#x901A;&#x4FE1;&#x548C;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x7684;&#x670D;&#x52A1;&#x5668;&#x96C6;&#x4E2D;&#x6709;&#x4E14;&#x53EA;&#x6709;&#x4E00;&#x4E2A;Leader;</li>
</ul>
</li>
</ul>
<h2 class="mume-header" id="%E6%97%A5%E5%BF%97%E5%A4%8D%E5%88%B6toc"><a href="#toc">&#x65E5;&#x5FD7;&#x590D;&#x5236;</a></h2>

<p><span class="mathjax-exps">$C\in \{C_i\}$</span>&#x63A5;&#x6536;&#x5230;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x540E;, &#x8BE5;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x5904;&#x7406;&#x65E5;&#x5FD7;&#x7684;&#x72B6;&#x6001;&#x673A;:</p>
<div class="mermaid">stateDiagram-v2

    [*] --&gt; Leader: &#x5BA2;&#x6237;&#x7AEF;Log
    [*] --&gt; Follower

    state Leader {
      state &quot;&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;&quot; as le
      state &quot;&#x5E7F;&#x64AD;&#x65E5;&#x5FD7;&quot; as ble
      state &quot;&#x63D0;&#x4EA4;&#x65E5;&#x5FD7;&quot; as cle
      state &quot;&#x6267;&#x884C;&#x65E5;&#x5FD7;&quot; as ale
      state &quot;&#x5FC3;&#x8DF3;&#x5305;&quot; as heartbeat

      [*] --&gt; le: &#x65E5;&#x5FD7;+&#x4EFB;&#x671F;+&#x7D22;&#x5F15;
      le --&gt; ble
      ble --&gt; cle: &#x8D85;&#x534A;&#x6570;Follower&#x54CD;&#x5E94;true
      ble --&gt; ble: &#x8D85;&#x534A;&#x6570;Follower&#x54CD;&#x5E94;false
      cle --&gt; ale
      cle --&gt; heartbeat
      ale --&gt; heartbeat
    }

    state Follower {
      state &quot;AppendEntries&#x6570;&#x636E;&#x5305;&quot; as fAE
      state &quot;&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;&quot; as fle
      state &quot;&#x5220;&#x9664;&#x65E5;&#x5FD7;&quot; as fdle
      state &quot;&#x63D0;&#x4EA4;&#x65E5;&#x5FD7;&quot; as fcle
      state &quot;&#x6267;&#x884C;&#x65E5;&#x5FD7;&quot; as fale
      state &quot;&#x54CD;&#x5E94;false&quot; as ffalse
      state &quot;&#x54CD;&#x5E94;true&quot; as ftrue

      [*] --&gt; fAE
      fAE --&gt; ffalse: &#x65E7;&#x4EFB;&#x671F;&#x6216;&#x5386;&#x53F2;&#x65E5;&#x5FD7;&#x4EFB;&#x671F;&#x4E0D;&#x4E00;&#x81F4;
      fAE --&gt; fdle: &#x7D22;&#x5F15;&#x5DF2;&#x5B58;&#x5728;&#x4F46;&#x65E5;&#x5FD7;&#x4EFB;&#x671F;&#x4E0D;&#x4E00;&#x81F4;
      fdle --&gt; fle: &#x6DFB;&#x52A0;&#x65B0;&#x65E5;&#x5FD7;
      fAE --&gt; fle: &#x6DFB;&#x52A0;&#x65B0;&#x7D22;&#x5F15;&#x7684;&#x65E5;&#x5FD7;
      fle --&gt; fcle: leaderCommit &gt; commitIndex
      fcle --&gt; fale: commitIndex &gt; lastApplied
      fale --&gt; ftrue
    }

    Leader --&gt; Follower: &#x8F6C;&#x4E3A;Follower
</div><p>&#x65E5;&#x5FD7;&#x590D;&#x5236;&#x6EE1;&#x8DB3;&#x4E86;<a href="#safety_for_raft">&#x65E5;&#x5FD7;&#x590D;&#x5236;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x7684;&#x6761;&#x4EF6;</a>, &#x5206;&#x6790;&#x5982;&#x4E0B;:</p>
<ul>
<li>&#x4ECE;&#x72B6;&#x6001;&#x673A;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x51FA;, Leader&#x4EC5;&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;, &#x4ECE;&#x4E0D;&#x5220;&#x9664;&#x65E5;&#x5FD7;;</li>
<li>&#x7A33;&#x6001;&#x60C5;&#x51B5;&#x4E0B;:
<ul>
<li>Leader&#x5E7F;&#x64AD;&#x65E5;&#x5FD7;, &#x5728;&#x5F97;&#x5230;&#x8D85;&#x8FC7;&#x534A;&#x6570;Follower&#x7684;&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;&#x7684;&#x4FE1;&#x606F;&#x540E;&#x63D0;&#x4EA4;&#x65E5;&#x5FD7;, &#x7136;&#x540E;&#x53D1;&#x9001;&#x5FC3;&#x8DF3;&#x5305;&#x544A;&#x77E5;Follower&#x4E5F;&#x63D0;&#x4EA4;&#x65E5;&#x5FD7;, &#x4ECE;&#x800C;&#x5B8C;&#x6210;&#x4E86;&#x8BE5;&#x6761;&#x65E5;&#x5FD7;&#x5728;&#x96C6;&#x7FA4;&#x7684;&#x590D;&#x5236;, &#x53C8;&#x7A33;&#x6001;&#x4E0B;&#x65E5;&#x5FD7;&#x4EFB;&#x671F;&#x4E00;&#x76F4;&#x662F;&#x76F8;&#x540C;&#x7684;, &#x5F52;&#x800C;&#x7EB3;&#x4E4B;&#x5DF2;&#x7ECF;&#x63D0;&#x4EA4;&#x7684;&#x65E5;&#x5FD7;&#x4F1A;&#x4E00;&#x76F4;&#x5B58;&#x5728;&#x4E14;&#x5404;<code>log[]</code>&#x76F8;&#x540C;&#x7D22;&#x5F15;&#x548C;&#x4EFB;&#x671F;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x90FD;&#x662F;&#x4ECE;&#x7B2C;&#x4E00;&#x6761;&#x5F00;&#x59CB;&#x8FDE;&#x7EED;&#x5B58;&#x5728;&#x7684;. &#x540C;&#x7406;, &#x5728;&#x76F8;&#x540C;&#x7D22;&#x5F15;&#x5904;&#x6267;&#x884C;&#x7684;&#x65E5;&#x5FD7;&#x4E5F;&#x662F;&#x76F8;&#x540C;&#x7684;;</li>
</ul>
</li>
<li>&#x975E;&#x7A33;&#x6001;&#x60C5;&#x51B5;&#x4E0B;:
<ul>
<li>Leader&#x6DFB;&#x52A0;&#x65E5;&#x5FD7;&#x540E;&#x8FD8;&#x672A;&#x5E7F;&#x64AD;&#x65E5;&#x5FD7;, &#x8F6C;&#x4E3A;&#x4E86;Follower. &#x90A3;&#x4E48;&#x5F53;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x8FBE;&#x5230;&#x96C6;&#x7FA4;, &#x5FC5;&#x7136;&#x7531;&#x4E00;&#x4E2A;&#x65B0;&#x4EFB;&#x671F;&#x7684;Leader&#x5728;&#x76F8;&#x540C;<code>log[]</code>&#x76F8;&#x540C;&#x7D22;&#x5F15;&#x7684;&#x4F4D;&#x7F6E;&#x6DFB;&#x52A0;&#x4E86;&#x65B0;&#x4EFB;&#x671F;&#x7684;&#x65E5;&#x5FD7;, &#x65B0;Leader<code>AppendEntries RPC</code>&#x8FEB;&#x4F7F;&#x8BE5;Follower&#x5220;&#x9664;&#x8BE5;&#x6761;&#x65E5;&#x5FD7;&#x66FF;&#x6362;&#x4E3A;&#x65B0;&#x65E5;&#x5FD7;;</li>
<li>Leader&#x5E7F;&#x64AD;&#x4E86;&#x65E5;&#x5FD7;, &#x8F6C;&#x4E3A;&#x4E86;Follower. &#x5982;&#x679C;&#x65B0;Leader&#x672A;&#x6536;&#x5230;&#x8BE5;&#x65E5;&#x5FD7;, &#x90A3;&#x4E48;&#x5FC5;&#x7136;&#x96C6;&#x7FA4;&#x4E2D;&#x672A;&#x672A;&#x8D85;&#x8FC7;&#x534A;&#x6570;&#x7684;&#x670D;&#x52A1;&#x5668;&#x90FD;&#x672A;&#x6536;&#x5230;&#x8BE5;&#x65E5;&#x5FD7;(&#x56E0;&#x4E3A;<code>RequestVote RPC</code>&#x7EA6;&#x675F;&#x4EC5;&#x4F1A;&#x7ED9;&#x6700;&#x540E;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x66F4;&#x65B0;&#x7684;Candidate&#x6295;&#x7968;), &#x4FBF;&#x548C;&#x4E0A;&#x4E00;&#x6761;&#x60C5;&#x51B5;&#x76F8;&#x540C;. &#x5982;&#x679C;&#x65B0;Leader&#x6536;&#x5230;&#x4E86;&#x8BE5;&#x65E5;&#x5FD7;, &#x90A3;&#x4E48;&#x56E0;&#x8BE5;&#x7D22;&#x5F15;&#x5904;&#x65E5;&#x5FD7;&#x4EFB;&#x671F;&#x76F8;&#x540C;, &#x8BE5;Follower&#x4F1A;&#x7EE7;&#x7EED;&#x4FDD;&#x7559;&#x8BE5;&#x65E5;&#x5FD7;;</li>
<li>Leader&#x63D0;&#x4EA4;&#x4E86;&#x65E5;&#x5FD7;, &#x8F6C;&#x4E3A;&#x4E86;Follower. &#x65B0;Leader&#x5FC5;&#x7136;&#x662F;&#x6536;&#x5230;&#x8BE5;&#x6761;&#x65E5;&#x5FD7;&#x7684;&#x670D;&#x52A1;&#x5668;, &#x8BE5;Followr&#x4F1A;&#x7EE7;&#x7EED;&#x4FDD;&#x7559;&#x8BE5;&#x65E5;&#x5FD7;;</li>
<li>Leader&#x6267;&#x884C;&#x4E86;&#x65E5;&#x5FD7;, &#x8F6C;&#x4E3A;&#x4E86;Follower, &#x548C;&#x4E0A;&#x4E00;&#x6761;&#x60C5;&#x51B5;&#x57FA;&#x672C;&#x76F8;&#x540C;. &#x8BE5;Follower&#x6267;&#x884C;&#x8BE5;&#x65E5;&#x4E4B;&#x540E;, &#x66F4;&#x884C;&#x4E86;<code>lastApplied=commitIndex</code>&#x4FBF;&#x4E0D;&#x4F1A;&#x518D;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x8BE5;&#x7D22;&#x5F15;&#x7684;&#x65E5;&#x5FD7;&#x4E86;;</li>
<li>&#x4EE5;&#x4E0A;&#x5F52;&#x800C;&#x7EB3;&#x4E4B;, &#x975E;&#x7A33;&#x6001;&#x60C5;&#x51B5;&#x4E0B;&#x8FDB;&#x5165;&#x7A33;&#x6001;&#x540E;&#x4F9D;&#x7136;&#x4F1A;&#x4FDD;&#x6301;&#x65E5;&#x5FD7;&#x7684;&#x4E00;&#x81F4;&#x6027;;</li>
</ul>
</li>
</ul>
<h2 class="mume-header" id="%E9%9B%86%E7%BE%A4%E5%92%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BA%A4%E4%BA%92toc"><a href="#toc">&#x96C6;&#x7FA4;&#x548C;&#x5BA2;&#x6237;&#x7AEF;&#x4EA4;&#x4E92;</a></h2>

<p>&#x5BA2;&#x6237;&#x7AEF;&#x542F;&#x52A8;&#x540E;&#x5982;&#x4F55;&#x627E;&#x5230;&#x96C6;&#x7FA4;&#x7684;Leader?</p>
<ul>
<li>&#x968F;&#x673A;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x670D;&#x52A1;&#x5668;, &#x53D1;&#x9001;&#x8BF7;&#x6C42;. &#x82E5;&#x8BE5;&#x670D;&#x52A1;&#x5668;&#x4E0D;&#x662F;Leader, &#x90A3;&#x4E48;&#x62D2;&#x7EDD;&#x8BE5;&#x8BF7;&#x6C42;, &#x5E76;&#x5C06;&#x4ECE;<code>AppendEntries RPC</code>&#x83B7;&#x5F97;&#x7684;&#x6700;&#x65B0;&#x7684;Leader&#x5730;&#x5740;&#x53D1;&#x9001;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;. &#x7ECF;&#x8FC7;&#x6709;&#x9650;&#x6B21;&#x7684;&#x8BF7;&#x6C42;&#x540E;, &#x5BA2;&#x6237;&#x7AEF;&#x5FC5;&#x4F1A;&#x627E;&#x5230;Leader;</li>
<li>&#x5982;&#x679C;&#x548C;&#x5BA2;&#x6237;&#x7AEF;&#x76F8;&#x8FDE;&#x7684;Leader&#x65E0;&#x6CD5;&#x518D;&#x548C;&#x5BA2;&#x6237;&#x7AEF;&#x901A;&#x4FE1;, &#x5BA2;&#x6237;&#x7AEF;&#x8BF7;&#x6C42;&#x8D85;&#x65F6;, &#x518D;&#x6B21;&#x968F;&#x673A;&#x9009;&#x62E9;&#x670D;&#x52A1;&#x5668;, &#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x67E5;&#x627E;&#x65B0;Leader;</li>
</ul>
<p>&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x5BA2;&#x6237;&#x7AEF;&#x5411;&#x96C6;&#x7FA4;&#x53D1;&#x51FA;&#x7684;&#x4E00;&#x6B21;&#x8BF7;&#x6C42;&#x5728;&#x903B;&#x8F91;&#x4E0A;&#x6709;&#x4E14;&#x4EC5;&#x6267;&#x884C;&#x4E00;&#x6B21;?</p>
<ul>
<li>&#x51FA;&#x73B0;&#x8BE5;&#x95EE;&#x9898;&#x7684;&#x539F;&#x56E0;: &#x5F53;&#x524D;Leader&#x5DF2;&#x7ECF;&#x63D0;&#x4EA4;&#x4E86;&#x65E5;&#x5FD7;, &#x7136;&#x540E;&#x8F6C;&#x4E3A;&#x4E86;Follower(&#x8F6C;&#x6362;&#x8FD9;&#x4E00;&#x8FC7;&#x7A0B;&#x4E2D;, &#x7531;&#x4E8E;&#x67D0;&#x79CD;&#x539F;&#x56E0;&#x4ED6;&#x6CA1;&#x6709;&#x6216;&#x6CA1;&#x6709;&#x53CA;&#x65F6;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;), &#x96C6;&#x7FA4;&#x4F1A;&#x9009;&#x51FA;&#x65B0;Leader, &#x7531;&#x524D;&#x8282;&#x77E5;&#x9053;&#x8BE5;&#x6761;&#x65E5;&#x5FD7;&#x8FD8;&#x662F;&#x5728;<code>log[]</code>&#x4E2D;&#x5E76;&#x5728;&#x540E;&#x7EED;&#x88AB;&#x6267;&#x884C;. &#x7531;&#x4E8E;&#x5BA2;&#x6237;&#x7AEF;&#x6CA1;&#x6709;&#x6536;&#x5230;&#x54CD;&#x5E94;, &#x518D;&#x6B21;&#x53D1;&#x9001;&#x8BF7;&#x6C42;, &#x65B0;Leader&#x6536;&#x5230;&#x8BE5;&#x65E5;&#x5FD7;&#x6DFB;&#x52A0;&#x5230;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x96C6;&#x4E2D;&#x5F85;&#x540E;&#x7EED;&#x6267;&#x884C;, &#x6B64;&#x65F6;&#x4FBF;&#x4F1A;&#x51FA;&#x73B0;&#x9700;&#x8981;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x7684;&#x65E5;&#x5FD7;, &#x5374;&#x4F1A;&#x51FA;&#x73B0;&#x591A;&#x6B21;&#x7684;&#x60C5;&#x51B5;;</li>
<li>&#x95EE;&#x9898;&#x7684;&#x89E3;&#x51B3;: &#x5BA2;&#x6237;&#x7AEF;&#x4E3A;&#x6BCF;&#x6761;&#x65E5;&#x5FD7;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x72EC;&#x4E00;&#x65E0;&#x4E8C;&#x7684;&#x5E8F;&#x5217;&#x7801;, Leader&#x5728;&#x6267;&#x884C;&#x67D0;&#x6761;&#x65E5;&#x5FD7;&#x6761;&#x76EE;&#x65F6;, &#x68C0;&#x67E5;&#x5DF2;&#x7ECF;&#x6267;&#x884C;&#x7684;&#x65E5;&#x5FD7;&#x96C6;&#x4E2D;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x6709;&#x8BE5;&#x5E8F;&#x5217;&#x7801;&#x4E86;, &#x6709;&#x5C31;&#x4E0D;&#x5728;&#x6267;&#x884C;&#x4E86;;</li>
</ul>
<p>&#x5982;&#x4F55;&#x4FDD;&#x8BC1;&#x96C6;&#x7FA4;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x67D0;&#x4E2A;&#x8BF7;&#x6C42;&#x53EA;&#x4F1A;&#x54CD;&#x5E94;&#x4E00;&#x6B21;, &#x5E76;&#x4E14;&#x4FDD;&#x8BC1;&#x7531;&#x6700;&#x65B0;Leader&#x7ED9;&#x51FA;&#x8BE5;&#x6B21;&#x54CD;&#x5E94;?</p>
<ul>
<li>&#x51FA;&#x73B0;&#x8BE5;&#x95EE;&#x9898;&#x7684;&#x539F;&#x56E0;: &#x5F53;&#x524D;Leader&#x63D0;&#x4EA4;&#x4E86;&#x65E5;&#x5FD7;, &#x96C6;&#x7FA4;&#x6B64;&#x523B;&#x9009;&#x51FA;&#x4E86;&#x65B0;Leader, &#x65E7;Leader&#x5728;&#x5F97;&#x77E5;&#x6709;&#x65B0;Leader&#x524D;&#x6267;&#x884C;&#x8BE5;&#x65E5;&#x5FD7;&#x7136;&#x540E;&#x54CD;&#x5E94;&#x4E86;&#x5BA2;&#x6237;&#x7AEF;, &#x65B0;Leader&#x4E5F;&#x4F1A;&#x6267;&#x884C;&#x8BE5;&#x65E5;&#x5FD7;&#x7136;&#x540E;&#x54CD;&#x5E94;&#x4E86;&#x5BA2;&#x6237;&#x7AEF;;</li>
<li>&#x95EE;&#x9898;&#x7684;&#x89E3;&#x51B3;: &#x65B0;Leader&#x53D1;&#x9001;&#x4E00;&#x4E2A;&#x7A7A;&#x547D;&#x4EE4;&#x7ED9;&#x5176;&#x5B83;&#x670D;&#x52A1;&#x5668;, &#x67E5;&#x8BE2;&#x96C6;&#x7FA4;&#x5DF2;&#x7ECF;&#x63D0;&#x4EA4;&#x7684;&#x6700;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x6761;&#x76EE;. Leader&#x5728;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;&#x8BF7;&#x6C42;&#x524D;&#x5224;&#x65AD;&#x96C6;&#x7FA4;&#x662F;&#x5426;&#x6709;&#x65B0;Leader&#x4E86;(&#x5411;&#x96C6;&#x7FA4;&#x5E7F;&#x64AD;&#x5FC3;&#x8DF3;&#x5305;, &#x901A;&#x8FC7;&#x54CD;&#x5E94;&#x6570;&#x636E;&#x5305;&#x4E2D;&#x7684;&#x4EFB;&#x671F;&#x67E5;&#x770B;&#x81EA;&#x5DF1;&#x7684;&#x4EFB;&#x671F;&#x662F;&#x5426;&#x6700;&#x65B0;, &#x662F;&#x6700;&#x65B0;&#x8BF4;&#x660E;&#x8FD8;&#x662F;Leader, &#x5411;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x51FA;&#x54CD;&#x5E94;);</li>
</ul>
<h2 class="mume-header" id="%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99toc"><a href="#toc">&#x53C2;&#x8003;&#x8D44;&#x6599;</a></h2>

<ul>
<li>In Search of an Understandable Concensus Algorithm (Extended Version), Diego Ongaro and John Ousterhoud, Stanford University;</li>
<li><a href="https://raft.github.io/">The Rast Consensus Algorithm</a>;</li>
<li><a href="https://www.cnblogs.com/hzmark/p/raft.html">&#x89E3;&#x8BFB;Raft</a>;</li>
<li><a href="https://www.jianshu.com/p/8e4bbe7e276c">&#x5171;&#x8BC6;&#x7B97;&#x6CD5;Raft</a>;</li>
</ul>

      </div>
      
      
    
    
    <script>
// config mermaid init call
// http://knsv.github.io/mermaid/#configuration
//
// You can edit the 'MERMAID_CONFIG' variable below.
MERMAID_CONFIG = {
  startOnLoad: false
}

if (window['MERMAID_CONFIG']) {
  window['MERMAID_CONFIG'].startOnLoad = false
  window['MERMAID_CONFIG'].cloneCssStyles = false
  window['MERMAID_CONFIG'].theme = "default"
}
mermaid.initialize(window['MERMAID_CONFIG'] || {})
if (typeof(window['Reveal']) !== 'undefined') {
  function mermaidRevealHelper(event) {
    var currentSlide = event.currentSlide
    var diagrams = currentSlide.querySelectorAll('.mermaid')
    for (var i = 0; i < diagrams.length; i++) {
      var diagram = diagrams[i]
      if (!diagram.hasAttribute('data-processed')) {
        mermaid.init(null, diagram, ()=> {
          Reveal.slide(event.indexh, event.indexv)
        })
      }
    }
  }
  Reveal.addEventListener('slidechanged', mermaidRevealHelper)
  Reveal.addEventListener('ready', mermaidRevealHelper)
} else {
  mermaid.init(null, document.getElementsByClassName('mermaid'))
}
</script>
    
    
    
    
    
  
    </body></html>